package de.unikoblenz.west.csxpoi;

/**
 * Encapsulates properties, which are specified by their URI (possibly inverse)
 * and have a name.
 */
public class PropertyWrapper {

	/**
	 * the URI of the property
	 */
	private String mUri = null;

	/**
	 * the name of the property
	 */
	private String mName = null;

	/**
	 * whether the URI represents the inverse of the property
	 */
	private boolean mInverse = false;

	/**
	 * the subclass property
	 */
	public static final PropertyWrapper SUBCLASS_OF = new PropertyWrapper(
			Constants.URI_RDFS_SUB_CLASS_OF, "subtype of");//"subclass of");

	/**
	 * the superclass property
	 */
	public static final PropertyWrapper SUPERCLASS_OF = new PropertyWrapper(
			Constants.URI_RDFS_SUB_CLASS_OF, "supertype of", true);//"superclass of", true);

	/**
	 * the equivalent property
	 */
	public static final PropertyWrapper EQUIVALENT_TO = new PropertyWrapper(
			Constants.URI_OWL_SAME_AS, "equivalent to");

	/**
	 * the list of contingent properties
	 */
	public static final PropertyWrapper[] CONTINGENT_PROPERTIES = {
			SUBCLASS_OF, SUPERCLASS_OF, EQUIVALENT_TO };

	/**
	 * Creates a property with the specified (possibly inverse) URI and name.
	 * 
	 * @param uri
	 *            the URI of the property
	 * @param name
	 *            the name of the property
	 * @param inverse
	 *            whether the URI represents the inverse of the property
	 */
	public PropertyWrapper(String uri, String name, boolean inverse) {
		mUri = uri;
		mName = name;
		mInverse = inverse;
	}

	/**
	 * Creates a property with the specified (not inverse) URI and name,
	 * 
	 * @param uri
	 *            the URI of the property
	 * @param name
	 *            the name of the property
	 */
	public PropertyWrapper(String uri, String name) {
		this(uri, name, false);
	}

	/**
	 * Gets the URI of the property.
	 * 
	 * @return the URI of the property
	 */
	public String getUri() {
		return mUri;
	}

	/**
	 * Gets the name of the property
	 * 
	 * @return the name of the property
	 */
	public String getName() {
		return mName;
	}

	/**
	 * Tests whether the URI represents the inverse of the property.
	 * 
	 * @return whether the URI represents the inverse of the property
	 */
	public boolean isInverse() {
		return mInverse;
	}

	/**
	 * The property's name is its string representation.
	 */
	@Override
	public String toString() {
		return mName;
	}

	/**
	 * POIs are equal if their URIs match.
	 */
	@Override
	public boolean equals(Object object) {
		try {
			PropertyWrapper property = (PropertyWrapper) object;
			return mUri.equals(property.getUri())
					&& mInverse == property.isInverse();
		} catch (ClassCastException e) {
			return false;
		} catch (NullPointerException e) {
			return false;
		}
	}

}
